﻿/**
 *  说明：此插件用于，周边查询的全库检索的使用，
 *  与jquery.bigautocomplete稍微有些区别。
 */
(function($){
	var aroundAutoComplete = new function(){

        //目前获得光标的输入框（解决一个页面多个输入框绑定自动补全功能）
		currentInputText = null;

        //键盘上功能键键值数组
		this.functionalKeyArray = [9,20,13,16,17,18,91,92,93,45,36,33,34,35,37,39,112,113,114,115,116,117,118,119,120,121,122,123,144,19,145,40,38,27];

        //输入框中原始输入的内容
        this.holdText = null;

        /**
         * 初始化插入自动补全div，并在document注册mousedown，点击非div区域隐藏div
         *
         * @param appendid
         *          追加到的容器id(若不存在，添加到body)
         */
        this.init = function(appendid){
            if(appendid){
                $("#"+appendid).append("<div class='around-auto-complete-content-layout'></div>");
            } else{
                $("body").append("<div class='around-auto-complete-content-layout'></div>");
            }

            //点击页面的其他地方 隐藏div
			$(document).bind('mousedown',function(event){
				var $target = $(event.target);
				if((!($target.parents().andSelf().is('.around-auto-complete-content-layout'))) && (!$target.is($(currentInputText)))){
                    aroundAutoComplete.hideAutocomplete();
				}
			})

            var $item = appendid ? $("#"+appendid+" .around-auto-complete-content-layout") : $("body .around-auto-complete-content-layout");
			
			//鼠标悬停时选中当前行   样式控制
            $item.delegate("tr", "mouseover", function() {
                $item.find("tr").removeClass("ct");
				$(this).addClass("ct");
			}).delegate("tr", "mouseout", function() {
                $item.find("tr").removeClass("ct");
			});		
			

			//单击选中行后，选中行内容设置到输入框中，并执行callback函数
            $item.delegate("tr", "click", function() {

                var tab = $(this).find("div:last");
                var tabvalue = tab.html();
                var code = tab.attr("value");  //行业代码

                //设置当前输入框的内容
				$(currentInputText).val(tabvalue);
                $(currentInputText).attr("value",code);
//                $(this).data("jsonData")


				var callback_ = $(currentInputText).data("config").callback;
                var isHiiden = $("#aroundAutoCompleteContent").is(":hidden");
				if(!isHiiden && callback_ && $.isFunction(callback_)){
					callback_($(this).data("jsonData"));
					
				}
                aroundAutoComplete.hideAutocomplete(appendid);
			})			
			
		}


        /**
         * 自动提交
         * @param param
         *          配置参数
         * @param appendid
         *          追加到的容器id(若不存在，添加到body)
         */
		this.autocomplete = function(param,appendid){
            //取得当前显示下拉内容容器的对象
            var $aroundAutoCompleteContent = getAroundAutoCompleteContentObj(appendid);

            if($("body").length > 0 && $aroundAutoCompleteContent.length <= 0){
                //初始化信息
                aroundAutoComplete.init(appendid);
                //初始化后取得当前显示下拉内容容器的对象
                $aroundAutoCompleteContent = getAroundAutoCompleteContentObj(appendid);
			}

			var $this = this;       //为绑定自动补全功能的输入框jquery对象

			this.config = {
               width:0,         //width:下拉框的宽度，默认使用输入框宽度
               url:null,        //url：格式url:""用来ajax后台获取数据，返回的数据格式为data参数一样
               data:null,       /*data：格式{data:[{title:null,result:{}},{title:null,result:{}}]} url 和 data参数只有一个生效，data优先*/
               callback:null    //callback：选中行后按回车或单击时回调的函数
            };

            //将param合并到 this.config中（这里前面传来了 url ，这将覆盖掉config中的url）
			$.extend(this.config,param);
            // 向元素 添加数据
			$this.data("config",this.config);
			
			//输入框keydown事件
			$this.keydown(function(event) {
				var node = event.currentTarget;
				switch (event.keyCode) {
				case 40:    //向下键
                    if($aroundAutoCompleteContent.is(":hidden"))
                        return;
					
					var $nextSiblingTr = $aroundAutoCompleteContent.find(".ct");
                    //没有选中行时，选中第一行
					if($nextSiblingTr.length <= 0){
						$nextSiblingTr = $aroundAutoCompleteContent.find("tr:first");
					}else{
						$nextSiblingTr = $nextSiblingTr.next();
					}
                    $aroundAutoCompleteContent.find("tr").removeClass("ct");

                    //有下一行时（不是最后一行）
					if($nextSiblingTr.length > 0){
                        //选中的行加背景
						$nextSiblingTr.addClass("ct");
                        ///////////////////////////

                        var tabvalue = $nextSiblingTr.find("div:last").html();
                        $(node).val(tabvalue);

                        //////////////////////////////

						//div滚动到选中的行,jquery-1.6.1 $nextSiblingTr.offset().top 有bug，数值有问题
                        $aroundAutoCompleteContent.scrollTop($nextSiblingTr[0].offsetTop - $aroundAutoCompleteContent.height() + $nextSiblingTr.height() );
						
					}else{
                        //输入框显示用户原始输入的值
						$(node).val(aroundAutoComplete.holdText);
					}

					break;
				case 38:    //向上键
					if($aroundAutoCompleteContent.is(":hidden"))
                        return;
					var $previousSiblingTr = $aroundAutoCompleteContent.find(".ct");
                    //没有选中行时，选中最后一行行
					if($previousSiblingTr.length <= 0){
						$previousSiblingTr = $aroundAutoCompleteContent.find("tr:last");
					}else{
						$previousSiblingTr = $previousSiblingTr.prev();
					}
                    $aroundAutoCompleteContent.find("tr").removeClass("ct");

                    //有上一行时（不是第一行）
					if($previousSiblingTr.length > 0){
                        //选中的行加背景
						$previousSiblingTr.addClass("ct");
                       /////////////////////////////////////////
                        var tabvalue = $previousSiblingTr.find("div:last").html();
                        $(node).val(tabvalue);
                       //////////////////////////////////////////////
						
						//div滚动到选中的行,jquery-1.6.1 $$previousSiblingTr.offset().top 有bug，数值有问题
                        $aroundAutoCompleteContent.scrollTop($previousSiblingTr[0].offsetTop - $aroundAutoCompleteContent.height() + $previousSiblingTr.height());
					}else{
                        //输入框显示用户原始输入的值
						$(node).val(aroundAutoComplete.holdText);
					}
					
					break;
				case 27:    //ESC键隐藏下拉框
					aroundAutoComplete.hideAutocomplete(appendid);
					break;
				}
			});		
			
			//输入框keyup事件
			$this.keyup(function(event) {
				var k = event.keyCode;
				var node = event.currentTarget;
				var ctrl = event.ctrlKey;
				var isFunctionalKey = false;    //按下的键是否是功能键
				var len = aroundAutoComplete.functionalKeyArray.length;
				for(var i=0; i<len; i++){
					if(k == aroundAutoComplete.functionalKeyArray[i]){
						isFunctionalKey = true;
						break;
					}
				}
				//k键值不是功能键或是ctrl+c、ctrl+x时才触发自动补全功能
				if(!isFunctionalKey && (!ctrl || (ctrl && k == 67) || (ctrl && k == 88)) ){
					var config = $(node).data("config");

					if(config.width <=0){
						config.width  = $(node).outerWidth() - 2
					}

                    //---样式----
                    $aroundAutoCompleteContent.width(config.width);
                    //文本框的高度
                    var h = $(node).outerHeight() - 1;
                    if(appendid){
                        var position = $(node).position();
                        //  top 后面的 -210是特别定制 换了其他地方会不适用
                        $aroundAutoCompleteContent.css({
                            "top": -5,
                            "left":position.left,
                            position: "inherit"
                        });
                    }else{
                        //文本框的相对窗口的位置
                        var offset = $(node).offset();

                        //  top 后面的
                        $aroundAutoCompleteContent.css({
                            "top":offset.top + h,
                            "left":offset.left
                        });
                    }
                    //---样式----

					var data = config.data;
					var url = config.url;

					var keyword_ = $.trim($(node).val());
					if(keyword_ == null || keyword_ == ""){
						aroundAutoComplete.hideAutocomplete(appendid);
						return;
					}

                    //是否从配置文件中取还是url 请求
					if(data != null && $.isArray(data) ){
						var data_ = new Array();
						for(var i=0,len=data.length; i<len; i++){
							if(data[i].title.indexOf(keyword_) > -1){
								data_.push(data[i]);
							}
						}
						
						makeContAndShow(data_);
					}else if(url != null && url != ""){//ajax请求数据
						$.post(url,{keyword:keyword_},function(result){
							makeContAndShow(result.data)
						},"json")
					}

					aroundAutoComplete.holdText = $(node).val();
				}
				//回车键
				if(k == 13){
					var callback_ = $(node).data("config").callback;
					if(!$aroundAutoCompleteContent.is(":hidden")){
						if(callback_ && $.isFunction(callback_)){
							callback_($aroundAutoCompleteContent.find(".ct").data("jsonData"));
						}
                        $aroundAutoCompleteContent.hide();
					}
				}
				
			});
					
			//组装下拉框html内容并显示
			function makeContAndShow(data_){
				if(data_ == null || data_.length <=0 ){
                    //清空
                    $aroundAutoCompleteContent.html("");
					return;
				}
				
				var cont = "<table><tbody>";
				for(var i=0,len=data_.length; i<len; i++){      //把value也添加进去
                    var value = data_[i].value;
                    if(!value)value= "";
					cont += "<tr><td><div value='"+value+"'>" + data_[i].title + "</div></td></tr>"
				}
				cont += "</tbody></table>";

                $aroundAutoCompleteContent.html(cont);
                $aroundAutoCompleteContent.show();
				
				//每行tr绑定数据，返回给回调函数
                $aroundAutoCompleteContent.find("tr").each(function(index){
					$(this).data("jsonData",data_[index]);
				})
			}
			
			//输入框focus事件
			$this.focus(function(event){
				currentInputText = event.currentTarget;
			});

            //点击输入框
            $this.click(function(event){
                //取得当前显示下拉内容容器的对象
                var $aroundAutoCompleteContent2 = getAroundAutoCompleteContentObj(appendid);
                if($aroundAutoCompleteContent2.is(":hidden")){
                    //有数据
                    if($aroundAutoCompleteContent2.find("tr").length > 0){
                        $aroundAutoCompleteContent2.show();
                    }
                }
            });
		};


		//隐藏下拉框
		this.hideAutocomplete = function(appendid){
            //取得当前显示下拉内容容器的对象
            var $aroundAutoCompleteContent = getAroundAutoCompleteContentObj(appendid);

            if(!$aroundAutoCompleteContent.is(":hidden")){
                $aroundAutoCompleteContent.find("tr").removeClass("ct");
                $aroundAutoCompleteContent.hide();
			}			
		};

        /**
         * 取得当前显示下拉内容容器的对象
         *
         * @param appendid
         * @returns {*|HTMLElement}
         */
        var getAroundAutoCompleteContentObj =function(appendid){
            return appendid ? $("#"+appendid+" .around-auto-complete-content-layout") : $("body .around-auto-complete-content-layout");
        };
		
	};

	$.fn.aroundAutoComplete = aroundAutoComplete.autocomplete;

})(jQuery)